package praktikum4Reservierungskomponente.Anwendungsfall;

import praktikum4GastKomponente.Datentyp.DGastNr;
import praktikum4Reservierungskomponente.Datentyp.DReservierungsNr;
import praktikum4Reservierungskomponente.Datentyp.DZimmerNr;
import praktikum4Reservierungskomponente.Datentyp.DZusatzleistungName;
import praktikum4Reservierungskomponente.Datentyp.DZusatzleistungNr;
import praktikum4Reservierungskomponente.Entitaeten.EReservierung;
import praktikum4Reservierungskomponente.Entitaeten.EZusatzleistungen;
import praktikum4Reservierungskomponente.Komponente.ReservierungsKomponente;
import praktikum4Reservierungskomponente.Verwalter.VReservierungsServices;

public class AFReservierungsServices {

	 static int zusatzCounter = 0;
	 static int resCounter = 0;
	
	 public static void reset(){
		 zusatzCounter = 0;
		 resCounter = 0;
	 }
	 
	 
	 
	/**
	 * Mit Hilfe dieser Methode, kann man Zusatzleistungen wie (SAUNA,WLAN...etc) erzeugen
	 * @param dZusatzleistungenName ist vom Datentyp DZusatzleistungName und ist der Name der Zusatzleistung
	 * @return Gibt ein Objekt zurueck vom Typ EZusatzleistungen
	 */
	public static EZusatzleistungen erzeugeZusatzleistung(DZusatzleistungName dZusatzleistungenName){
		
		DZusatzleistungNr dZusatzleistungNr = new DZusatzleistungNr(zusatzCounter);
		
		EZusatzleistungen eZusatzleistungen = new EZusatzleistungen(dZusatzleistungenName,dZusatzleistungNr);
		
		zusatzCounter++;
		
		praktikum4Reservierungskomponente.Verwalter.VReservierungsServices.erzeugeZusatzleistung(eZusatzleistungen);
		
		return eZusatzleistungen;
	}
	
	/**
	 * Mit Hilfe dieser Methode kann man ein Zimmer fuer einen Gast reservieren
	 * @param dGastNr ist vom Datentyp DGastNr und ist die Nummer eines Gastes der das Zimmer reserviert
	 * @param dZimmerNr ist vom Datentyp DZimmerNr und ist die Nummer des Zimmers, dass reserviert wird
	 * @return Gibt ein Objekt zurueck vom Typ EReservierung
	 */
	public static EReservierung reserviereZimmer(DGastNr dGastNr,DZimmerNr dZimmerNr){
		
		DReservierungsNr dReservierungsNr = new DReservierungsNr(resCounter);
		
		EReservierung eReservierung = new EReservierung(dGastNr, dZimmerNr, dReservierungsNr);
		
		resCounter++;
		
		praktikum4Reservierungskomponente.Verwalter.VReservierungsServices.reserviereZimmer(eReservierung);
		
		wirdKundeStammkunde(dGastNr);
		
		return eReservierung;
	}
	
	/**
	 * Mit Hilfe dieser Methode kann man zu bestehenden Reservierungen, Zusatzleistungen buchen
	 * @param dReservierungsNr ist vom Datentyp DReservierung und ist die Nummer der Reservierung, der die Leistung zugebucht wird
	 * @param dZusatzleistungNr ist vom Datentyp DZusatzleistungNr und ist die Nummer der Zusatzleistung die gebucht wird
	 */
	public static void bucheZusatzleistung(DReservierungsNr dReservierungsNr, DZusatzleistungNr dZusatzleistungNr){
		praktikum4Reservierungskomponente.Verwalter.VReservierungsServices.bucheZusatzleistung(dReservierungsNr, dZusatzleistungNr);
		//wirdKundeStammkunde(VReservierungsServices.getKundenummmerVonReservierung(dReservierungsNr));
	}
	
	/**
	 * Mit Hilfe dieser Methode wird ein Kunde fuer den Fall, dass er mehr 5x eine Reservierung durchgefuehrt hat oder
	 * 3x eine Reservierung mit Zusatzbuchung, dann wird er in den Status den Stammkunden versetzt 
	 * @param dGastNr ist vom Datentyp DGast und ist die Nummer der Gastes, der ueberprueft werden soll
	 */
	private static void wirdKundeStammkunde(DGastNr dGastNr){
		
		if(VReservierungsServices.anzahlReservierungen(dGastNr) >= 6){
			ReservierungsKomponente.gastKomponente.markiereGastAlsStammkunden(dGastNr.getNr());
		}
		
		if(VReservierungsServices.anzahlReservierungenMitZusatzbuchung(dGastNr) >= 3){
			ReservierungsKomponente.gastKomponente.markiereGastAlsStammkunden(dGastNr.getNr());
		}
	}
}
